題目:
(6 級) English beggars
你的任務相當簡單:
你會得到一組陣列和數名乞丐,回傳一個陣列,裡面包含每個乞丐帶回家的總和,假設他們每個人都乖乖排隊,從第一個分發到最後一個。
範例:[1,2,3,4,5]
分給 2 位乞丐,所以應該回傳 [9,6]
,第一位拿到 [1,3,5]
,第二位拿到 [2,4]
一樣的陣列分給 3 位乞丐,則會讓第二位乞丐得到更好的結果:[5,7,3]
,他們分別會拿到 [1,4]
,[2,5]
和 [3]
請注意並非所有乞丐都會拿到等量的"捐助",意思是陣列不需要是 n
的倍數;陣列長度甚至可以更短,這樣子的話,剩下的乞丐們將什麼都拿不到 (0)。
Ruby 解法:
def beggars(values, n)
# 先準備一個放結果的空陣列 new_arr
new_arr = []
# 如果參數 n 為 1
# 直接回傳陣列的總和
return Array(values.sum) if n == 1
# 依照乞丐的人數依序算出每個人會拿到多少
n.times do |i|
# 把每位乞丐拿到的結果放進 new_arr 中
new_arr << values.select.with_index { |num, index|
# 如果是最後一位乞丐 (i 從 0 開始)
if (i + 1) == n
# 就把 "index + 1" 能被 n 整除的數字分給他 (index 從 0 開始)
num if (index + 1) % n == 0
else
# 反之則分別將數字分給餘數相對應的乞丐
num if (index + 1) % n == (i + 1)
end
# 最後將每位乞丐拿到的數字加總
}.sum
end
# 回傳計算後的陣列 new_arr
new_arr
end
JavaScript 解法:
function beggars(values, n){
// 先準備一個放結果的空陣列 new_arr
let new_arr = [];
// 如果參數 n 為 1
if (n === 1) {
// 直接將陣列的總和放進 new_arr 並回傳
new_arr.push(values.reduce((a, b) => a + b, 0));
return new_arr;
}
// 依照乞丐的人數依序算出每個人會拿到多少
for(let i = 1; i <= n; i++) {
// 把每位乞丐拿到的結果放進 selected 中
let selected = values.filter((num, index) => {
// 如果是最後一位乞丐 (i 從 0 開始)
if (i === n) {
// 就把 "index + 1" 能被 n 整除的數字分給他 (index 從 0 開始)
if ((index + 1) % n === 0) { return num; }
} else {
// 反之則分別將數字分給餘數相對應的乞丐
if ((index + 1) % n === i) { return num; }
}
})
// 最後將每位乞丐拿到的數字加總,並放進陣列 new_arr 中
new_arr.push(selected.reduce((a, b) => a + b, 0));
}
// 回傳計算後的陣列 new_arr
return new_arr;
}